/*
 * $Id$
 */

package corejs.stmt;

import corejs.expr.Expression;


import corejs.rt.RuntimeStack;
import corejs.rt.Value;

import java.util.List;

/**
 *
 * @author pengyu
 */
public interface StatementVisitor {

   enum Interruption { BREAK, CONTINUE, RETURN }

   RuntimeStack getRuntimeStack();
   
   /**
    * 
    * @param fds
    * @param vds
    * @param stmts 
    */
   void visitBlock(List<FunctionDeclaration> fds, 
                   List<VarDeclaration> vds, 
                   List<Statement> stmts);


   /**
    * 
    * @param names 
    */
   void visitVars(List<String> names);


   /**
    *
    * @param expr
    */
   Value visitExpression(final Expression expr);

   /**
    * 
    * @param expr 
    */
   void visitReturn(final Expression expr);

   /**
    * 
    * @param test
    * @param then
    * @param els 
    */
   void visitIf(Expression test, Statement then, Statement els);

   /**
    * 
    * @param label 
    */
   void visitBreak(String label);


   /**
    * 
    * @param label 
    */
   void visitContinue(String label);
   
   
   /**
    * 
    * @param loop 
    */
   void visitLoop(Loop loop);

}
